package cn.jasonone.tio.tcp.config;

import cn.hutool.core.util.ReflectUtil;
import cn.jasonone.tio.tcp.TioMessage;
import cn.jasonone.tio.tcp.config.properties.ServerProperties;
import cn.jasonone.tio.tcp.handler.DataAioHandler;
import cn.jasonone.tio.tcp.listener.GlobalAioListener;
import cn.jasonone.server.TcpServer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;
import org.tio.core.stat.IpStatListener;
import org.tio.server.ServerTioConfig;
import org.tio.server.TioServer;

import java.lang.reflect.Field;

/**
 * @author xujie
 * @version 1.0
 * @date 2022/1/18 8:54
 */
@Slf4j
@Import(TioConfig.class)
@ImportAutoConfiguration
public class ServerConfig {

    @Bean
    public ServerTioConfig tioConfig(DataAioHandler dataAioHandler, GlobalAioListener globalAioListener, IpStatListener ipStatListener, ServerProperties serverProperties) {
        ServerTioConfig serverTioConfig = new ServerTioConfig("tio-tcp-server", dataAioHandler, globalAioListener);
        serverTioConfig.setIpStatListener(ipStatListener);
        serverTioConfig.setHeartbeatTimeout(serverProperties.getHeartbeatTimeout());
        Field field = ReflectUtil.getField(TioMessage.class, "tioConfig");
        ReflectUtil.setFieldValue(null, field, serverTioConfig);
        return serverTioConfig;
    }

    @Bean
    public TioServer tioServer(ServerTioConfig serverTioConfig) {
        return new TioServer(serverTioConfig);
    }

    @Bean
    public TcpServer tcpServer(TioServer tioServer, ServerProperties serverProperties) {
        return new TcpServer(serverProperties, tioServer);
    }
}
